/**
 * Title: DaoManager.java
 * Description:
 * Copyright: Copyright (c) 2008
 * Company:深圳彩讯科技有限公司
 * Author 罗旭东 (hi@luoxudong.com)
 * Date 2013-8-2 下午3:57:17
 * Version 1.0 
 */
package com.luoxudong.phonenumber.service.database.manager; 	

import java.io.File;

import android.database.sqlite.SQLiteDatabase;

import com.luoxudong.phonenumber.service.base.SingletonFactory;
import com.luoxudong.phonenumber.service.database.interfaces.IDaoManager;
import com.luoxudong.phonenumber.service.exception.PhoneNumberException;
import com.luoxudong.phonenumber.service.utils.EvtLog;

/** 
 * ClassName: DaoManager 
 * Description:基础数据库管理类
 * Create by 罗旭东
 * Date 2013-8-2 下午3:57:17 
 */
public class DaoManager implements IDaoManager{
	private static final String TAG = DaoManager.class.getName();
	
	/**
	 * 数据库文件地址
	 */
	private String databasePath = null;
	
	private SQLiteDatabase database = null;
	
	public DaoManager(String databasePath)
	{
		this.databasePath = databasePath;
		openDatabase();
	}
	
	@Override
	public DaoManager openDatabase() {
		if (databasePath == null)
		{
			throw new PhoneNumberException("数据库路径不能为空!");
		}
		
		if (isDatabseOpened())
		{
			EvtLog.w(TAG, "数据库已经打开");
			return this;
		}
		
		File databaseFile = new File(databasePath);
		
		//保存数据库的文件夹不存在则创建
		if (databaseFile != null && !databaseFile.getParentFile().exists())
		{
			databaseFile.getParentFile().mkdirs();
		}
		
		database = SQLiteDatabase.openOrCreateDatabase(databasePath, null);
		EvtLog.d(TAG, "数据库创建成功![" + databasePath + "]");
		return this;
	}
	
	@Override
	public synchronized void closeDatabase() {
		if (database == null)
		{
			EvtLog.d(TAG, "数据库对象为空!");
			return ;
		}
		
		if (database.isOpen())
		{
			database.close();
			EvtLog.d(TAG, "关闭数据库成功!");
		}
		else
		{
			EvtLog.d(TAG, "数据库已经关闭!");
		}
	}
	
	@Override
	public synchronized DaoManager reOpenDatabase() {
		EvtLog.e(TAG, "重新打开数据库:" + databasePath);
		
		// 关闭数据库
		closeDatabase();
		
		// 打开数据库
		openDatabase();
		
		return this;
	}
	
	/**
	 * 获取管理容器中的数据访问帮助类
	 * @param clazz
	 * @param entityClass
	 * @return
	 */
	@Override
	public <T extends BaseDao<M, Long>, M> T getDataHelper(Class<T> clazz, Class<M> entityClass)
	{
		T baseDao = SingletonFactory.getInstance(clazz);
		if (!baseDao.isDbInited())
		{
			baseDao.init(entityClass, databasePath);
		}
		return baseDao;
	}
	
	/**
	 * 判断数据库是否已经打开
	 * @return
	 */
	private boolean isDatabseOpened()
	{
		if (database == null)
		{
			return false;
		}
		
		return database.isOpen();
	}

	public SQLiteDatabase getDatabase() {
		return database;
	}
}
